{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to preprocess a mixed dataset for machine learning\n",
    "\n",
    "** What is preprocessing? **  \n",
    "Preprocessing describes the process of cleaning and converting a 'raw' (i.e. unprocessed) dataset into a clean dataset.\n",
    "\n",
    "![alt text](figures/preprocessing.png)\n",
    "\n",
    "When given a dataset, the preprocessing can have various steps depending on  \n",
    "a) what type of data you're looking at (text, images, time series, ...)  \n",
    "b) what models you want to train\n",
    "\n",
    "In this notebook we will look at a **dataset with both numerical and cateogorical attributes**.\n",
    "\n",
    "## Possible preprocessing steps\n",
    "\n",
    "As mentioned already, the preprocessing steps you will need for your dataset depend on the nature of the dataset and models you want to train. Possible preprocessing steps are:\n",
    "\n",
    "- Rescaling attributes with different scales\n",
    "- Standardizing the dataset\n",
    "- Encoding categorial attributes with integer values\n",
    "- Handling missing data\n",
    "- Removing duplicated data points\n",
    "- Removing outliers/ handle noisy data\n",
    "- Discretize the data\n",
    "- Split the dataset into a training and test set\n",
    "\n",
    "## The Pima Indians Diabetes Dataset\n",
    "\n",
    "In this notebook we will work with the Pima Indians Diabetes Dataset. The dataset has 9 attributes:\n",
    "\n",
    "| Attribute name | Description \n",
    "| --------------| ---------------------------|\n",
    "| Pregnancies | Number of times pregnant\n",
    "| Glucose | Plasma glucose concentration a 2 hours in an oral glucose tolerance test\n",
    "| Blood pressure | Diastolic blood pressure (mm Hg)\n",
    "| Skin thickness | Triceps skin fold thickness (mm)\n",
    "| Insulin | 2-Hour serum insulin (mu U/ml)\n",
    "| BMI | Body mass index\n",
    "| Diabetes pedigree function | Diabetes pedigree function\n",
    "| Age | Age in years\n",
    "| Diagnosis | 0 or 1 (0: no diabetes, 1: diabetes)\n",
    "\n",
    "\n",
    "\n",
    "Further information about the dataset can be found [here](https://www.kaggle.com/uciml/pima-indians-diabetes-database).\n",
    "\n",
    "## Downloading the dataset\n",
    "\n",
    "The diabetes dataset is available on several websites. We will use the version provided by [Kaggle](https://www.kaggle.com/uciml/pima-indians-diabetes-database/data). \n",
    "\n",
    "For datasets with multiple attributes a pandas DataFrame is the most convenient format. Therefore, we will use pandas to download our data and put it into a DataFrame."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "import os\n",
    "\n",
    "% matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_path = os.path.expanduser('~/ml_basics/data/diabetes.csv')\n",
    "df = pd.read_csv(data_path)#, names=column_names)\n",
    "column_names = df.columns.tolist()\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Inspecting the dataset\n",
    "\n",
    "Two pandas functions make it very easy to take a first look at the dataset: ```DataFrame.describe()``` and ```DataFrame.info()```. From the current [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.describe.html)\n",
    "\n",
    "\n",
    "``` DataFrame.info() ```   \n",
    "Print a concise summary of a DataFrame.   \n",
    "\n",
    "``` DataFrame.describe():```  \n",
    "Generates descriptive statistics that summarize the central tendency, dispersion and shape of a dataset’s distribution, excluding NaN values.   \n",
    "Analyzes both numeric and object series, as well as DataFrame column sets of mixed data types. The output will vary depending on what is provided. Refer to the notes below for more detail."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that there are 768 instances in the dataset, which is very small for a machine learning dataset. For most algorithms you will need more data. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The variables *count, mean, std* and *max* are self-explanatory. Using the minimum values we can already see that the minimum value of many attributes is 0. For the \"pregnancies\" attribute this makes sense. However, for attributes like \"blood pressure\" or \"insulin\" is doesn't. This  indicates that certain values are missing.\n",
    "\n",
    "The rows named *25%, 50%* and *75%* represent the corresponding *percentiles*. For example, 25% of the woman had less than 1 pregnancy, 50% had less than 3 pregnancies and 75% had less than 6 pregnancies. \n",
    "\n",
    "## Visualizing aspects of the dataset\n",
    "\n",
    "Another way to get familiar with the dataset is to look at all numerical attributes and plot a histogram for each of them.\n",
    "\n",
    "> What is a histogram?   \n",
    "> A histogram is a graphical representation of data that uses bars of different heights. It groups data points into value ranges. The exact shape of the value ranges depends on the number of bars. With a lot of bars, value ranges will be small, with only a few bars they will be wider. The height of a bar (y-axis) represents the number of data points that fall into the corresponding value range (x-axis). \n",
    "\n",
    "Since our dataset has only numerical values we can simply call the ```DataFrame.hist()``` function (see section \"Encoding categorical attributes\" for more details on how to convert categorical to numerical attributes).\n",
    "\n",
    "```DataFrame.hist()``` calls matplotlib.pyplot.hist() on each series in the DataFrame, resulting in one histogram per column (i.e. one histogram per attribute).\n",
    "\n",
    "The histograms will also make it easier to detect outliers or erroneous values (see section \"Handling noisy data\" for more details)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f31145e5b38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.hist(bins=50, figsize=(25, 20))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can observe several things in these histograms:\n",
    "\n",
    "1. Some entries have the \"insulin\" and/or \"skin_thickness\" attribute set to zero. As mentioned before, this indicates that certain values are missing.\n",
    "2. The attributes have different scales. We will see later how to handle this.\n",
    "3. Some histograms extend further to the left of the median than to the right. Other histograms are more centered. We will discuss at a later point how these different distributions can be handeled."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Removing duplicated data points\n",
    "\n",
    "To make sure that none of the data point are duplicated and hence overrepresented, we can scan the dataset for duplicated entries and delete them. This becomes very easy with the ```DataFrame.drop_duplicates()``` function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.drop_duplicates(keep='first', inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Creating a test set\n",
    "\n",
    "If you want to train a machine learning model on your data it's important that you create a separate test set BEFORE you do any further preprocessing. The test set is put aside and not looked at, it's sole purpose is to allow for an evaluation of the trained classifier.\n",
    "\n",
    "Creating a test set is very easy using scikit-learn. We will use 20% of the data as a test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "original_train_df, test_df = train_test_split(df, test_size=0.2)\n",
    "\n",
    "# To be sure we will create a copy for further processing\n",
    "train_df = original_train_df.copy() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gaining further insight\n",
    "\n",
    "To further improve our understanding of the dataset, we can add a few more exploration steps. Besides creating more plots, another useful thing is looking for *correlations* between the attributes. \n",
    "\n",
    "For example, we can compute [Pearson's correlation coefficient](https://en.wikipedia.org/wiki/Pearson_correlation_coefficient). From the linked Wikipedia website:\n",
    "\n",
    "> Pearson's correlation coefficient is a measure of the linear correlation between two variables X and Y. It has a value between +1 and −1, where 1 is total positive linear correlation, 0 is no linear correlation, and −1 is total negative linear correlation.\n",
    "\n",
    "A 'total positive linear correlation' means that as X increases, Y increases. A 'total negative linear correlation' means that as X increases, Y *decreases*.\n",
    "\n",
    "We can easily compute Pearson's correlation coefficient between every pair of attributes using ```DataFrame.corr()```. In fact, ```DataFrame.corr()``` could also be used to compute the Kendall Tau correlation coefficient or  Spearman rank correlation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Pregnancies</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.141610</td>\n",
       "      <td>0.124869</td>\n",
       "      <td>-0.090113</td>\n",
       "      <td>-0.074484</td>\n",
       "      <td>0.003832</td>\n",
       "      <td>0.004180</td>\n",
       "      <td>0.523424</td>\n",
       "      <td>0.245579</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Glucose</th>\n",
       "      <td>0.141610</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.138061</td>\n",
       "      <td>0.055264</td>\n",
       "      <td>0.323325</td>\n",
       "      <td>0.210250</td>\n",
       "      <td>0.165979</td>\n",
       "      <td>0.280893</td>\n",
       "      <td>0.465803</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BloodPressure</th>\n",
       "      <td>0.124869</td>\n",
       "      <td>0.138061</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.220584</td>\n",
       "      <td>0.094920</td>\n",
       "      <td>0.291821</td>\n",
       "      <td>0.086961</td>\n",
       "      <td>0.246683</td>\n",
       "      <td>0.060411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SkinThickness</th>\n",
       "      <td>-0.090113</td>\n",
       "      <td>0.055264</td>\n",
       "      <td>0.220584</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.441852</td>\n",
       "      <td>0.415479</td>\n",
       "      <td>0.195016</td>\n",
       "      <td>-0.130566</td>\n",
       "      <td>0.082470</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Insulin</th>\n",
       "      <td>-0.074484</td>\n",
       "      <td>0.323325</td>\n",
       "      <td>0.094920</td>\n",
       "      <td>0.441852</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.215458</td>\n",
       "      <td>0.155286</td>\n",
       "      <td>-0.046646</td>\n",
       "      <td>0.136964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BMI</th>\n",
       "      <td>0.003832</td>\n",
       "      <td>0.210250</td>\n",
       "      <td>0.291821</td>\n",
       "      <td>0.415479</td>\n",
       "      <td>0.215458</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.151589</td>\n",
       "      <td>0.017820</td>\n",
       "      <td>0.273198</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <td>0.004180</td>\n",
       "      <td>0.165979</td>\n",
       "      <td>0.086961</td>\n",
       "      <td>0.195016</td>\n",
       "      <td>0.155286</td>\n",
       "      <td>0.151589</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.042359</td>\n",
       "      <td>0.207851</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Age</th>\n",
       "      <td>0.523424</td>\n",
       "      <td>0.280893</td>\n",
       "      <td>0.246683</td>\n",
       "      <td>-0.130566</td>\n",
       "      <td>-0.046646</td>\n",
       "      <td>0.017820</td>\n",
       "      <td>0.042359</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.253536</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Outcome</th>\n",
       "      <td>0.245579</td>\n",
       "      <td>0.465803</td>\n",
       "      <td>0.060411</td>\n",
       "      <td>0.082470</td>\n",
       "      <td>0.136964</td>\n",
       "      <td>0.273198</td>\n",
       "      <td>0.207851</td>\n",
       "      <td>0.253536</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          Pregnancies   Glucose  BloodPressure  SkinThickness  \\\n",
       "Pregnancies                  1.000000  0.141610       0.124869      -0.090113   \n",
       "Glucose                      0.141610  1.000000       0.138061       0.055264   \n",
       "BloodPressure                0.124869  0.138061       1.000000       0.220584   \n",
       "SkinThickness               -0.090113  0.055264       0.220584       1.000000   \n",
       "Insulin                     -0.074484  0.323325       0.094920       0.441852   \n",
       "BMI                          0.003832  0.210250       0.291821       0.415479   \n",
       "DiabetesPedigreeFunction     0.004180  0.165979       0.086961       0.195016   \n",
       "Age                          0.523424  0.280893       0.246683      -0.130566   \n",
       "Outcome                      0.245579  0.465803       0.060411       0.082470   \n",
       "\n",
       "                           Insulin       BMI  DiabetesPedigreeFunction  \\\n",
       "Pregnancies              -0.074484  0.003832                  0.004180   \n",
       "Glucose                   0.323325  0.210250                  0.165979   \n",
       "BloodPressure             0.094920  0.291821                  0.086961   \n",
       "SkinThickness             0.441852  0.415479                  0.195016   \n",
       "Insulin                   1.000000  0.215458                  0.155286   \n",
       "BMI                       0.215458  1.000000                  0.151589   \n",
       "DiabetesPedigreeFunction  0.155286  0.151589                  1.000000   \n",
       "Age                      -0.046646  0.017820                  0.042359   \n",
       "Outcome                   0.136964  0.273198                  0.207851   \n",
       "\n",
       "                               Age   Outcome  \n",
       "Pregnancies               0.523424  0.245579  \n",
       "Glucose                   0.280893  0.465803  \n",
       "BloodPressure             0.246683  0.060411  \n",
       "SkinThickness            -0.130566  0.082470  \n",
       "Insulin                  -0.046646  0.136964  \n",
       "BMI                       0.017820  0.273198  \n",
       "DiabetesPedigreeFunction  0.042359  0.207851  \n",
       "Age                       1.000000  0.253536  \n",
       "Outcome                   0.253536  1.000000  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "correlation_matrix = train_df.corr(method='pearson')\n",
    "\n",
    "correlation_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at how each attribute correlates with the final diagnosis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BloodPressure               0.060411\n",
       "SkinThickness               0.082470\n",
       "Insulin                     0.136964\n",
       "DiabetesPedigreeFunction    0.207851\n",
       "Pregnancies                 0.245579\n",
       "Age                         0.253536\n",
       "BMI                         0.273198\n",
       "Glucose                     0.465803\n",
       "Outcome                     1.000000\n",
       "Name: Outcome, dtype: float64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "correlation_matrix[\"Outcome\"].sort_values()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The highest correlation exists for the attribute \"glucose\" but none of these correlations are very high. However, it's important that we keep in mind that Pearson's only measures *linear* correlations. Nonlinear correlations are not measured and might still exist!\n",
    "\n",
    "Tip: if you want to take a closer look at correlations and create some plots consider pandas [scatter matrix](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.plotting.scatter_matrix.html) function."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Handling missing data\n",
    "\n",
    "To make sure that we don't mistake missing values as being 0, we will replace them with 'NaN' (short for \"not a number\"). We need to handle missing values in the columns 'glucose', 'blood_pressure', 'skin_thickness', 'insulin', 'bmi', 'diabetes_pedigree_function' and 'age'."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "names = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']\n",
    "\n",
    "for name in names:\n",
    "    train_df[name].replace(0, np.nan, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>171</th>\n",
       "      <td>6</td>\n",
       "      <td>134.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>130.0</td>\n",
       "      <td>35.4</td>\n",
       "      <td>0.542</td>\n",
       "      <td>29</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>705</th>\n",
       "      <td>6</td>\n",
       "      <td>80.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>36.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>39.8</td>\n",
       "      <td>0.177</td>\n",
       "      <td>28</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>761</th>\n",
       "      <td>9</td>\n",
       "      <td>170.0</td>\n",
       "      <td>74.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>44.0</td>\n",
       "      <td>0.403</td>\n",
       "      <td>43</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>1</td>\n",
       "      <td>115.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>96.0</td>\n",
       "      <td>34.6</td>\n",
       "      <td>0.529</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>507</th>\n",
       "      <td>1</td>\n",
       "      <td>130.0</td>\n",
       "      <td>60.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>170.0</td>\n",
       "      <td>28.6</td>\n",
       "      <td>0.692</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "171            6    134.0           70.0           23.0    130.0  35.4   \n",
       "705            6     80.0           80.0           36.0      NaN  39.8   \n",
       "761            9    170.0           74.0           31.0      NaN  44.0   \n",
       "19             1    115.0           70.0           30.0     96.0  34.6   \n",
       "507            1    130.0           60.0           23.0    170.0  28.6   \n",
       "\n",
       "     DiabetesPedigreeFunction  Age  Outcome  \n",
       "171                     0.542   29        1  \n",
       "705                     0.177   28        0  \n",
       "761                     0.403   43        1  \n",
       "19                      0.529   32        1  \n",
       "507                     0.692   21        0  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Missing attribute values can be handled in several ways. For example we can:\n",
    "- Delete or ignore the data points with missing values\n",
    "- Replace the missing values, for example with the median of the corresponding attribute\n",
    "- Remove the entire attribute from the dataset\n",
    "\n",
    "We will stick to the second option. This means that we first compute the median of each attribute. In a second step we replace missing values with the corresponding attribute median, using ```DataFrame.fillna()```.\n",
    "\n",
    "A more advanced way to do this, which avoids computing each median manually is scikit-learn's [imputer class](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "glucose_median = train_df[\"Glucose\"].median()\n",
    "blood_pressure_median = train_df[\"BloodPressure\"].median()\n",
    "skin_thickness_median = train_df[\"SkinThickness\"].median()\n",
    "insulin_median = train_df[\"Insulin\"].median()\n",
    "bmi_median = train_df[\"BMI\"].median()\n",
    "age_median = train_df[\"Age\"].median()\n",
    "dpf_median = train_df['DiabetesPedigreeFunction'].median()\n",
    "\n",
    "train_df[\"Glucose\"].fillna(glucose_median, inplace=True)\n",
    "train_df[\"BloodPressure\"].fillna(blood_pressure_median, inplace=True)\n",
    "train_df[\"SkinThickness\"].fillna(skin_thickness_median, inplace=True)\n",
    "train_df[\"Insulin\"].fillna(insulin_median, inplace=True)\n",
    "train_df[\"BMI\"].fillna(bmi_median, inplace=True)\n",
    "train_df[\"Age\"].fillna(age_median, inplace=True)\n",
    "train_df[\"DiabetesPedigreeFunction\"].fillna(dpf_median, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>171</th>\n",
       "      <td>6</td>\n",
       "      <td>134.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>130.0</td>\n",
       "      <td>35.4</td>\n",
       "      <td>0.542</td>\n",
       "      <td>29</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>705</th>\n",
       "      <td>6</td>\n",
       "      <td>80.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>36.0</td>\n",
       "      <td>126.0</td>\n",
       "      <td>39.8</td>\n",
       "      <td>0.177</td>\n",
       "      <td>28</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>761</th>\n",
       "      <td>9</td>\n",
       "      <td>170.0</td>\n",
       "      <td>74.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>126.0</td>\n",
       "      <td>44.0</td>\n",
       "      <td>0.403</td>\n",
       "      <td>43</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>1</td>\n",
       "      <td>115.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>96.0</td>\n",
       "      <td>34.6</td>\n",
       "      <td>0.529</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>507</th>\n",
       "      <td>1</td>\n",
       "      <td>130.0</td>\n",
       "      <td>60.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>170.0</td>\n",
       "      <td>28.6</td>\n",
       "      <td>0.692</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "171            6    134.0           70.0           23.0    130.0  35.4   \n",
       "705            6     80.0           80.0           36.0    126.0  39.8   \n",
       "761            9    170.0           74.0           31.0    126.0  44.0   \n",
       "19             1    115.0           70.0           30.0     96.0  34.6   \n",
       "507            1    130.0           60.0           23.0    170.0  28.6   \n",
       "\n",
       "     DiabetesPedigreeFunction  Age  Outcome  \n",
       "171                     0.542   29        1  \n",
       "705                     0.177   28        0  \n",
       "761                     0.403   43        1  \n",
       "19                      0.529   32        1  \n",
       "507                     0.692   21        0  "
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Handling noisy data and outliers\n",
    "\n",
    "It might happen that some entries of our dataset are noisy or that the dataset contains outliers. For example, the blood pressure of some person might be extremely high if they suffer from hypertension. Outliers might also represent **erroneous values**. For example, the age attribute should lie below 120.\n",
    "\n",
    "Outliers can be detected in different ways. For the age attribute we could simply check the statistics given by ```df.describe()``` and check if the min and max values are reasonable. The same holds for other attributes. If you know in which range the attribute values should lie, you can quickly test if the dataset values are within that range.\n",
    "\n",
    "Once you detect outliers you can decide how you want to deal with them. For example, you could remove them.\n",
    "\n",
    "## Encoding categorial attributes\n",
    "\n",
    "This dataset does not contain categorical attributes. Therefore, we don't have to encode them with integer ID's. \n",
    "\n",
    "For the sake of understanding, let's walk through an example with categorical attributes. Suppose our dataset had an additional column, listing the fitness of each individual. The \"fitness\" attribute has 4 possible values: \"bad\", \"moderate\", \"good\", \"very good\". "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "      <th>fitness</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>171</th>\n",
       "      <td>6</td>\n",
       "      <td>134.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>130.0</td>\n",
       "      <td>35.4</td>\n",
       "      <td>0.542</td>\n",
       "      <td>29</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>705</th>\n",
       "      <td>6</td>\n",
       "      <td>80.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>36.0</td>\n",
       "      <td>126.0</td>\n",
       "      <td>39.8</td>\n",
       "      <td>0.177</td>\n",
       "      <td>28</td>\n",
       "      <td>0</td>\n",
       "      <td>moderate</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>761</th>\n",
       "      <td>9</td>\n",
       "      <td>170.0</td>\n",
       "      <td>74.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>126.0</td>\n",
       "      <td>44.0</td>\n",
       "      <td>0.403</td>\n",
       "      <td>43</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>1</td>\n",
       "      <td>115.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>96.0</td>\n",
       "      <td>34.6</td>\n",
       "      <td>0.529</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>507</th>\n",
       "      <td>1</td>\n",
       "      <td>130.0</td>\n",
       "      <td>60.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>170.0</td>\n",
       "      <td>28.6</td>\n",
       "      <td>0.692</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "171            6    134.0           70.0           23.0    130.0  35.4   \n",
       "705            6     80.0           80.0           36.0    126.0  39.8   \n",
       "761            9    170.0           74.0           31.0    126.0  44.0   \n",
       "19             1    115.0           70.0           30.0     96.0  34.6   \n",
       "507            1    130.0           60.0           23.0    170.0  28.6   \n",
       "\n",
       "     DiabetesPedigreeFunction  Age  Outcome   fitness  \n",
       "171                     0.542   29        1       bad  \n",
       "705                     0.177   28        0  moderate  \n",
       "761                     0.403   43        1       bad  \n",
       "19                      0.529   32        1       bad  \n",
       "507                     0.692   21        0      good  "
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Copy original dataframe and add new column with random fitness values\n",
    "temp_df = train_df.copy()\n",
    "fitness_values = [\"bad\", \"moderate\", \"good\", \"very good\",]\n",
    "temp_df['fitness'] = np.random.choice(fitness_values, temp_df.shape[0])\n",
    "\n",
    "temp_df.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Most machine learning algorithms work with numerical data, so whenever you have categorical attributes with text labels it can be useful to convert the labels into numbers. In our case, we could encode the text labels as follows: {\"bad\": 0, \"moderate\": 1, \"good\": 2, \"very good\": 3}. This can easily be done using scikit-learn's [LabelEncoder](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "class id 0 has label bad\n",
      "class id 1 has label good\n",
      "class id 2 has label moderate\n",
      "class id 3 has label very good\n",
      "\n",
      "Encoded fitness values for first 10 entries: [0 2 0 0 1 2 2 2 3 1]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "encoder = LabelEncoder()\n",
    "fitness_encoded = encoder.fit_transform(temp_df[\"fitness\"])\n",
    "\n",
    "for id_, class_ in enumerate(encoder.classes_):\n",
    "    print(f\"class id {id_} has label {class_}\")\n",
    "\n",
    "print()\n",
    "print(f\"Encoded fitness values for first 10 entries: {fitness_encoded[:10]}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "An disadvantage of an integer encoding like {\"bad\": 0, \"moderate\": 1, \"good\": 2, \"very good\": 3} arises from the functioning of some machine learning algorithms: when comparing different data points, two nearby values (e.g. 2 and 3) will be considered more \"similar\" than distant values (like 0 and 3) although the corresponding categories might not necessarily be similar to each other. \n",
    "\n",
    "Another possibility (which solves the just mentioned problem) would be to create a *one-hot encoding* of the attribute values. In our case this means that each text label would become a binary attribute, e.g. \"bad fitness\", \"moderate fitness\", \"good fitness\" and \"very good fitness\". The labels would simply be 0 or 1.\n",
    "\n",
    "For example, if a person has a \"good\" fitness, the attributes \"bad fitness\", \"moderate fitness\" and \"very good fitness\" would be set to 0, the \"good fitness\" attribute to 1.\n",
    "\n",
    "To create one-hot encoded labels we could use scikit-learn's [OneHotEncoder](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html) and [LabelBinarizer](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Rescaling or standardizing attributes\n",
    "\n",
    "Several algorithms are sensitive to the *scale* of numerical attributes and won't perform well if the attributes have very different scales. \n",
    "\n",
    "A classical example is the [k-nearest-neighbor algorithm](https://github.com/zotroneneis/machine_learning_basics/blob/master/k_nearest_neighbour.ipynb). When having an attribute \"age\" that ranges from 0 to 100 and an attribute \"income\" that ranges from 1 to 1.000.000, the attribute with the larger range will have a higher influence on the result.\n",
    "\n",
    "Therefore, whenever having attributes with different scales, make sure to rescale them. Two standard ways of rescaling are [min-max scaling](https://en.wikipedia.org/wiki/Feature_scaling) and [standardization](https://en.wikipedia.org/wiki/Feature_scaling).\n",
    "\n",
    "In min-max scaling each feature value is rescaled to be in the range from 0 to 1. The formula for applying min-max scaling to some attribute value $x_i$ is:   \n",
    "\n",
    "$x'_i = \\frac{x_i - min(x)}{max(x) - min(x)}$\n",
    "\n",
    "with $min(x)$ being the minimum value of attribute $x$ and $x'_i$ being the rescaled value of $x_i$.\n",
    "\n",
    "To perform min-max scaling we can use scikit-learn's [MinMax Scaler](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.352941</td>\n",
       "      <td>0.670968</td>\n",
       "      <td>0.489796</td>\n",
       "      <td>0.304348</td>\n",
       "      <td>0.134615</td>\n",
       "      <td>0.314928</td>\n",
       "      <td>0.234415</td>\n",
       "      <td>0.568627</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.264516</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.239130</td>\n",
       "      <td>0.134615</td>\n",
       "      <td>0.171779</td>\n",
       "      <td>0.116567</td>\n",
       "      <td>0.196078</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.896774</td>\n",
       "      <td>0.408163</td>\n",
       "      <td>0.244565</td>\n",
       "      <td>0.134615</td>\n",
       "      <td>0.104294</td>\n",
       "      <td>0.253629</td>\n",
       "      <td>0.215686</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.290323</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>0.096154</td>\n",
       "      <td>0.202454</td>\n",
       "      <td>0.038002</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.176471</td>\n",
       "      <td>0.219355</td>\n",
       "      <td>0.265306</td>\n",
       "      <td>0.271739</td>\n",
       "      <td>0.088942</td>\n",
       "      <td>0.261759</td>\n",
       "      <td>0.072588</td>\n",
       "      <td>0.098039</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies   Glucose  BloodPressure  SkinThickness   Insulin       BMI  \\\n",
       "0     0.352941  0.670968       0.489796       0.304348  0.134615  0.314928   \n",
       "1     0.058824  0.264516       0.428571       0.239130  0.134615  0.171779   \n",
       "2     0.470588  0.896774       0.408163       0.244565  0.134615  0.104294   \n",
       "3     0.058824  0.290323       0.428571       0.173913  0.096154  0.202454   \n",
       "6     0.176471  0.219355       0.265306       0.271739  0.088942  0.261759   \n",
       "\n",
       "   DiabetesPedigreeFunction       Age  Outcome  \n",
       "0                  0.234415  0.568627      1.0  \n",
       "1                  0.116567  0.196078      0.0  \n",
       "2                  0.253629  0.215686      1.0  \n",
       "3                  0.038002  0.000000      0.0  \n",
       "6                  0.072588  0.098039      1.0  "
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "# initialize min-max scaler\n",
    "mm_scaler = MinMaxScaler()\n",
    "\n",
    "temp1_df = train_df.copy()\n",
    "column_names = temp1_df.columns.tolist()\n",
    "\n",
    "# transform all attributes\n",
    "temp1_df[column_names] = mm_scaler.fit_transform(temp1_df[column_names])\n",
    "\n",
    "temp1_df.sort_index(inplace=True)\n",
    "temp1_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: it's important that you fit the scaler only on the TRAINING set (not the test set!)\n",
    "\n",
    "The other approach, called **standardization** transform attributes such that they're distributed according to a standard normal distribution with mean 0 and standard deviation 1.   \n",
    "The formula for standardizing some attribute value $x_i$ is:   \n",
    "\n",
    "$x'_i = \\frac{x_i - mean(x)}{\\sigma(x)}$\n",
    "\n",
    "with $mean(x)$ being the mean of attribute $x$, $\\sigma(x)$ being the standard deviation of attribute $x$ and $x'_i$ being the rescaled value of $x_i$.\n",
    "\n",
    "To perform standardization we can use scikit-learn's [Standard Scaler](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.352941</td>\n",
       "      <td>0.670968</td>\n",
       "      <td>0.489796</td>\n",
       "      <td>0.304348</td>\n",
       "      <td>0.134615</td>\n",
       "      <td>0.314928</td>\n",
       "      <td>0.234415</td>\n",
       "      <td>0.568627</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.264516</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.239130</td>\n",
       "      <td>0.134615</td>\n",
       "      <td>0.171779</td>\n",
       "      <td>0.116567</td>\n",
       "      <td>0.196078</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.896774</td>\n",
       "      <td>0.408163</td>\n",
       "      <td>0.244565</td>\n",
       "      <td>0.134615</td>\n",
       "      <td>0.104294</td>\n",
       "      <td>0.253629</td>\n",
       "      <td>0.215686</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.290323</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>0.096154</td>\n",
       "      <td>0.202454</td>\n",
       "      <td>0.038002</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.176471</td>\n",
       "      <td>0.219355</td>\n",
       "      <td>0.265306</td>\n",
       "      <td>0.271739</td>\n",
       "      <td>0.088942</td>\n",
       "      <td>0.261759</td>\n",
       "      <td>0.072588</td>\n",
       "      <td>0.098039</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies   Glucose  BloodPressure  SkinThickness   Insulin       BMI  \\\n",
       "0     0.352941  0.670968       0.489796       0.304348  0.134615  0.314928   \n",
       "1     0.058824  0.264516       0.428571       0.239130  0.134615  0.171779   \n",
       "2     0.470588  0.896774       0.408163       0.244565  0.134615  0.104294   \n",
       "3     0.058824  0.290323       0.428571       0.173913  0.096154  0.202454   \n",
       "6     0.176471  0.219355       0.265306       0.271739  0.088942  0.261759   \n",
       "\n",
       "   DiabetesPedigreeFunction       Age  Outcome  \n",
       "0                  0.234415  0.568627      1.0  \n",
       "1                  0.116567  0.196078      0.0  \n",
       "2                  0.253629  0.215686      1.0  \n",
       "3                  0.038002  0.000000      0.0  \n",
       "6                  0.072588  0.098039      1.0  "
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "standard_scaler = StandardScaler()\n",
    "\n",
    "temp2_df = train_df.copy()\n",
    "\n",
    "# transform all attributes\n",
    "temp2_df[column_names] = mm_scaler.fit_transform(temp2_df[column_names])\n",
    "temp2_df.sort_index(inplace=True)\n",
    "temp2_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "These steps should be enough to get us started with training machine learning models on the data. If you want to know more about those, check out the other notebooks!"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
